package com.h819.core.net.ftp.ftp4j;

import com.h819.core.net.ftp.Ftp4jUtils;
import it.sauronsoftware.ftp4j.*;
import it.sauronsoftware.ftp4j.connectors.SOCKS4Connector;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import static java.lang.System.out;

/**
 * @Title: Ftp4j.java
 * @Description: TODO(添加描述)
 * @author H819
 * @date 2010-3-19
 * @version V1.0
 */
public class Ftp4jExamples {

	private void examples() throws IllegalStateException,
			FileNotFoundException, IOException, FTPIllegalReplyException,
			FTPException, FTPDataTransferException, FTPAbortedException,
			FTPListParseException {
		// TODO Auto-generated method stub

		// 1. 创建FTPClient实例
		FTPClient client = new FTPClient();
		// 连接到指定的FTP服务器(域名或IP) 不指定端口，则使用默认端口21
		client.connect("ftp.host.com");

		// 设置编码
		client.setCharset("GBK");
		// 登录验证
		client.login("user", "pswd");

		// 下面是匿名登录(个别服务器匿名登录，密码格式应该是一个邮件地址)
		// client.login("anonymous", "密码任意设置");
		// client.login("anonymous", "ftp4j");

		// 安全退出(接收服务器回应之后再退出)
		client.disconnect(true);
		// 强制退出(不接收服务器回应，直接退出)
		// client.disconnect(false);

		// 2. === 文件以及文件夹操作:
		// 取得当前文件夹
		String dir = client.currentDirectory();

		// 改变当前文件夹
		client.changeDirectory("newpath");
		// 绝对路径
		// client.changeDirectory("/an/absolute/one");
		// 相对路径
		// client.changeDirectory("relative");

		// 回退到上级目录
		client.changeDirectoryUp();

		// 重命名文件或文件夹
		client.rename("oldname", "newname");

		// 移动文件或文件夹:移动 myfile.txt 到同级目录 myfolder 下
		// 文件夹同文件，只是没有扩展名
		client.rename("myfile.txt", "myfolder/myfile.txt");

		// 删除文件
		client.deleteFile("relativeOrAbsolutePath");
		// client.deleteFile("useless.txt");

		// 创建目录
		client.createDirectory("newfolder");

		// 删除目录(有的服务器只允许删除空目录，此时需要先删除其中的文件)
		client.deleteDirectory("absoluteOrRelativePath");
		// client.deleteDirectory("oldfolder");

		// 浏览文件列表(不同服务器list返回命令格式不同，如果出现异常，参考官方文档，并且多做测试)
		FTPFile[] list = client.list();
		// 可应用过滤器浏览文件
		// FTPFile[] list = client.list("*.jpg");
		// The list of the files (and directories) in the current working
		// directory.
		// 经过测试，未显示文件夹名称
		String[] listname = client.listNames();

		// 显示文件或文件夹的修改时间
		java.util.Date md = client.modifiedDate("filename.ext");

		// 3. 上传和下载文件。
		// 如果文件为文件夹，那么也可以下载或者上传文件夹
		// 下载服务器上remoteFile.ext 下载到本地 localFile.ext
		client.download("remoteFile.ext", new java.io.File("localFile.ext"),
				new Ftp4jTransferListener());
		// 上传本地 localFile.ext 到当前目录
		client.upload(new java.io.File("localFile.ext"),
				new Ftp4jTransferListener());

		// ftp4j也支持断点续传功能
		// 下面是一个简单示例：*参数 1056 跳过 1056字节点下载
		client.download("remoteFile.ext", new java.io.File("localFile.ext"),
				1056);

		// 4.其他设置
		// 设置传输模式.要多测试文件，否则会出现乱码，尤其是 txt 文件
		// ASC码
		client.setType(FTPClient.TYPE_TEXTUAL);
		// 二进制
		client.setType(FTPClient.TYPE_BINARY);
		// 根据文件内容自动选择(默认)
		client.setType(FTPClient.TYPE_AUTO);

		// Active mode
		client.setPassive(false);
		// Passive mode(默认)
		client.setPassive(true);

		// 测试服务器是否支持压缩数据传输模式
		boolean compressionSupported = client.isCompressionSupported();

		// 如果判断了服务器支持，就可以开启
		client.setCompressionEnabled(true);
		// 取消压缩模式
		client.setCompressionEnabled(false);
		// 测试是否启动了压缩模式
		boolean compressionEnabled = client.isCompressionEnabled();

		// 发生一次 noop 命令(默认不自动发送)
		client.noop();

		// 每隔 30000 毫秒发送一次 noop 命令
		client.setAutoNoopTimeout(30000);

		// 取消定时发送命令
		client.setAutoNoopTimeout(0);

		// 设置代理
		SOCKS4Connector socks4 = new SOCKS4Connector("127.0.0.1", 1080);
		client.setConnector(socks4);
		client.connect("an.ip.or.host", 21);
		client.login("anonymous", "bianbian@bianbian.org");
		// 其他同非代理模式
	}

	/**
	 * 判断服务器上指定文件是否存在
	 * 
	 * @param file
	 * @return
	 */
	public boolean exists(FTPFile file) {
		// 通过判断文件名是否存在
		return file.getName() == null;
	}

	public static boolean exists(FTPClient client, String remoteFileName) {

		if (remoteFileName.endsWith("/") || remoteFileName.endsWith("\\"))
			try {
				client.changeDirectory(remoteFileName);
				return true;
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return false;
			}
		return false;
	}

	public static void main(String[] args) throws IllegalStateException,
			FileNotFoundException, IOException, FTPIllegalReplyException,
			FTPException, FTPDataTransferException, FTPAbortedException {

		Ftp4jUtils ftp = new Ftp4jUtils();

		// 1. 创建FTPClient实例
		// FTPClient client = ftp.getFTPClient("127.0.0.1", "java", "java");
		FTPClient client = ftp.getFTPClient("129.9.200.236", "read", "readpdf");

		// client.setAutoNoopTimeout(3000);

		out.println("currentDirectory: " + client.currentDirectory());
		
		client.download("/HB/QB/QB~2499-2000.PDF", new File("d:/a.pdf"));

		out.println("client.getType() :" + client.getType());
		out.println("client.getType() :" + client.getListParsers());

		// 测试
		try {
			for (FTPFile f : client.list()) {

				// out.println(f.getName() + ":" + f.getType());
				// int type = f.getType();
				// if (type == FTPFile.TYPE_FILE) {
				// out.println("TYPE_FILE:" + f.getName());
				// }
				// if (type == FTPFile.TYPE_DIRECTORY) {
				// // directory
				// out.println("TYPE_DIRECTORY:" + f.getName());
				// }
				// if (type == FTPFile.TYPE_LINK) {
				// // link
				// out.println("TYPE_LINK:" + f.getName());
				// }
			}

			for (String s : client.listNames()) {
				//out.println("listNames :" + s);
			}

			File f1 = new File("F://list.txt");
			File f2 = new File("F://ftp4jtext//");
			File f3 = new File("F://ftp4jtext//");
			// client.upload(f3,new Ftp4jTransferListener() );

			// ============ 上传
			// client.upload(f1, new Ftp4jTransferListener(f1));
			// client.upload(f2, new Ftp4jTransferListener(f2));
			// client.upload(new File("F://IT人健康宝典V2版.pdf"), new
			// Ftp4jTransferListener());
			// client.upload(new File("F://IT人健康宝典V2版.swf"), new
			// Ftp4jTransferListener());
			// client.upload(new File("F://365英语口语大全（交际口语篇）.iso"), new
			// Ftp4jTransferListener());

			// 改变目录
			// client.changeDirectory("/001/3");
			// out.println(exists(client, "/001/33/"));
			// ============ 下载

			//client.createDirectory("016");

			// client.download("/IT人健康宝典V2版.pdf", new
			// File("f:\\IT人健康宝典V2版.pdf"));

			// 安全退出(接收服务器回应之后再退出)
			// client.disconnect(true);
			// 强制退出(不接收服务器回应，直接退出)
			client.disconnect(false);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
